const vscode = require('vscode');
const path = require('path');
const fs = require('fs')

function getWebViewContent(context, templatePath) {
	console.log("> getWebViewContent:", templatePath)
	const resourcePath = path.join(context.extensionPath, templatePath);
	console.log("> resource:", resourcePath)
	const dirPath = path.dirname(resourcePath);
	console.log("> dirPath:", dirPath)
	let html = fs.readFileSync(resourcePath, 'utf-8');
	//vscode不支持直接加载本地资源，需要替换成其专有路径格式，这里只是简单的将样式和JS的路径替换
	html = html.replace(/(<link.+?href="|<script.+?src="|<img.+?src=")(.+?)"/g, (m, $1, $2) => {
		return $1 + vscode.Uri.file(path.resolve(dirPath, $2)).with({ scheme: 'vscode-resource' }).toString() + '"';
	});
	return html;
}

function activate(context) {

	console.log('恭喜，您的扩展“vscode-plugin-demo”已被激活！');
	// 注册命令
	context.subscriptions.push(vscode.commands.registerCommand('demo.helloWorld', function () {
		// 获取当前文件的路径
		let currentFilePath = vscode.window.activeTextEditor.document.fileName;
		console.log("当前文件路径为：", currentFilePath)

		// 读取文件内容
		let currentJson = fs.readFileSync(currentFilePath, 'utf8');
		console.log("当前文件内容为：", currentJson)

		// 尝试解析文件内容
		let currentLvgl = {};
		try {
			console.log("解析 JSON 内容，并格式化")
			currentLvgl = JSON.parse(currentJson)
			//
			// TODO 这里可以对 lvgl 的对象根据文档，做一些预处理
			// 譬如填写一些比较的默认字段，甚至做一些属性检查等
			//
		} catch (E) {
			console.error("文件内容不是合法的 JSON")
			return
		}

		// 读取 html
		let html = getWebViewContent(context, "lvgl-editor/index.html")
		//console.log("读取到的HTML:", html)
		// 创建webview
		const panel = vscode.window.createWebviewPanel(
			'lvglDesignerWebview', // viewType
			"Lvgl设计器WebView演示", // 视图标题
			vscode.ViewColumn.One, // 显示在编辑器的哪个部位
			{
				enableScripts: true, // 启用JS，默认禁用
				retainContextWhenHidden: true, // webview被隐藏时保持状态，避免被重置
			}
		);
		// 设置 Webview 的网页内容（加载 IDE）
		panel.webview.html = html

		// 可见性
		panel.webview.onDidReceiveMessage(message => {
			console.log("onDidReceiveMessage", message)
			switch (message.command) {
				case 'lvgl_json_receive':
					console.log('插件收到的LVGL对象:', message);
					break;
				case 'lvglPageReady':
					if (message.text) {
						console.log('WebView 准备就绪，发送数据:', currentLvgl);
						panel.webview.postMessage(
							{
								command: 'lvgl',
								text: currentLvgl
							}
						);
					}
					break;
				case 'lvglReadBase64':
					console.log('插件收到读取图片 base64 内容的请求', message.text);
					// 获取图片基于工程的相对路径
					let pictureBase64Path = message.text;
					// 获取图片的绝对路径
					const picturePath = path.join(currentFilePath,'..',pictureBase64Path);
					if (!fs.existsSync(picturePath)) {
						console.log('图片输入地址有误')
						return;
					}
					// 读取文件内容，并转换为 base64
					console.log("读取本地文件", picturePath);
					let bitmap = fs.readFileSync(picturePath);
					let base64 = Buffer.from(bitmap).toString('base64');
					console.log("转换为base64", base64.substring(0, 100), "...");
					// 获取后缀名
					let suffix = path.extname(pictureBase64Path).substring(1,);
					let prefix = `data:image/${suffix};base64`;
					// 将内容发送给 webview
					panel.webview.postMessage({
						'command': 'lvglPictureBase64',
						'text': {
							readBase64: true,
							pictureBase64Path,
							base64: `${prefix},${base64}`
						}
					})
					break;
			}
		}, undefined, context.subscriptions)

	}));
}


function deactivate() {
	console.log('您的扩展“vscode-plugin-demo”已被释放！')
}
module.exports = {
	activate,
	deactivate
}
